<?php
namespace app\service;

use think\facade\Log;
use Exception;

class AiHistoryService
{
    protected $aiService;
    
    public function __construct(AiService $aiService)
    {
        $this->aiService = $aiService;
    }

    /**
     * 处理会话历史并生成回复
     */
    public function processHistoryAndGenerateReply(array $messages, array $sessionInfo)
    {
        // Log::debug('开始处理历史消息：'. json_encode([
        //     'messages_count' => count($messages),
        //     'session_info' => $sessionInfo
        // ], JSON_UNESCAPED_UNICODE));

        // 如果消息数量超过阈值，需要进行汇总
        if (count($messages) > AiService::MAX_HISTORY_MESSAGES) {
            // Log::debug('消息数量超过阈值，开始汇总'. json_encode([
            //     'threshold' => AiService::MAX_HISTORY_MESSAGES,
            //     'actual_count' => count($messages)
            // ], JSON_UNESCAPED_UNICODE));

            $messages = $this->summarizeHistory($messages, $sessionInfo);
            
            // Log::debug('消息汇总完成：'. json_encode([
            //     'summarized_count' => count($messages),
            //     'summarized_messages' => $messages
            // ], JSON_UNESCAPED_UNICODE));
        }
        
        return $messages;
    }

    /**
     * 汇总历史消息
     */
    protected function summarizeHistory(array $messages, array $sessionInfo)
    {
        // Log::debug('开始汇总历史消息：', [
        //     'messages_count' => count($messages),
        //     'has_summary' => !empty($sessionInfo['summary']),
        //     'last_summarized_id' => $sessionInfo['last_summarized_message_id'] ?? null
        // ]);

        // 如果存在之前的汇总
        if (!empty($sessionInfo['summary'])) {
            $summarizedMessages = [
                [
                    'role' => 'system',
                    'content' => "以下是之前的会话汇总：\n" . $sessionInfo['summary']
                ]
            ];
            
            // 获取上次汇总后的新消息
            $newMessages = array_filter($messages, function($msg) use ($sessionInfo) {
                $hasMessageId = isset($msg['message_id']);
                $lastSummarizedId = $sessionInfo['last_summarized_message_id'] ?? 0;
                
                // Log::debug('消息ID检查：'. json_encode([
                //     'message' => $msg,
                //     'has_message_id' => $hasMessageId,
                //     'message_id' => $hasMessageId ? $msg['message_id'] : null,
                //     'last_summarized_id' => $lastSummarizedId
                // ], JSON_UNESCAPED_UNICODE));
                
                return $hasMessageId && $msg['message_id'] > $lastSummarizedId;
            });
            
            // Log::debug('过滤后的新消息：'. json_encode([
            //     'new_messages_count' => count($newMessages),
            //     'new_messages' => $newMessages
            // ], JSON_UNESCAPED_UNICODE));

            // 如果新消息数量也较多，需要再次汇总
            if (count($newMessages) > AiService::MAX_HISTORY_MESSAGES) {
                $summaryPrompt = $this->buildSummaryPrompt($newMessages);
                $summary = $this->generateSummary($summaryPrompt);
                
                // 获取最后一条消息的ID
                $lastMessageId = 0;
                foreach ($newMessages as $msg) {
                    if (isset($msg['message_id']) && $msg['message_id'] > $lastMessageId) {
                        $lastMessageId = $msg['message_id'];
                    }
                }
                
                // 更新数据库中的汇总信息
                if ($lastMessageId > 0) {
                    $this->updateSessionSummary(
                        $sessionInfo['id'], 
                        $summary, 
                        $lastMessageId
                    );
                }
                
                // 返回汇总后的消息数组
                return array_merge(
                    $summarizedMessages,
                    [['role' => 'system', 'content' => "新的会话汇总：\n" . $summary]],
                    array_slice($newMessages, -5) // 保留最近的5条消息
                );
            }
            
            // 如果新消息数量适中，直接合并
            return array_merge($summarizedMessages, $newMessages);
        }
        
        // 首次汇总
        $summaryPrompt = $this->buildSummaryPrompt($messages);
        $summary = $this->generateSummary($summaryPrompt);
        
        // 获取最后一条消息的ID
        $lastMessageId = 0;
        foreach ($messages as $msg) {
            if (isset($msg['message_id']) && $msg['message_id'] > $lastMessageId) {
                $lastMessageId = $msg['message_id'];
            }
        }
        
        // 更新数据库中的汇总信息
        if ($lastMessageId > 0) {
            $this->updateSessionSummary(
                $sessionInfo['id'], 
                $summary, 
                $lastMessageId
            );
        }
        
        // 返回汇总后的消息数组
        return array_merge(
            [['role' => 'system', 'content' => "会话汇总：\n" . $summary]],
            array_slice($messages, -5) // 保留最近的5条消息
        );
    }

    /**
     * 构建汇总提示词
     */
    protected function buildSummaryPrompt(array $messages): string
    {
        $conversationText = array_reduce($messages, function($carry, $message) {
            return $carry . sprintf(
                "%s: %s\n",
                $message['role'] === 'user' ? '用户' : 'AI',
                $message['content']
            );
        }, '');
        
        return <<<EOT
请对以下对话内容进行重点摘要总结，提取关键信息和主要讨论内容：

{$conversationText}

请以简洁的方式总结上述对话的：
1. 主要讨论主题
2. 关键结论或决定
3. 重要的细节信息
EOT;
    }

    /**
     * 生成汇总内容
     */
    protected function generateSummary(string $prompt): string
    {
        $summary = '';
        $this->aiService->streamChat([
            ['role' => 'user', 'content' => $prompt]
        ], function($chunk) use (&$summary) {
            $summary .= $chunk;
        });
        return $summary;
    }

    /**
     * 更新会话汇总信息
     */
    protected function updateSessionSummary(int $sessionId, string $summary, int $lastMessageId): void
    {
        \think\facade\Db::name('chat_sessions')->where('id', $sessionId)->update([
            'summary' => $summary,
            'last_summarized_message_id' => $lastMessageId,
            'ai_analyzed_at' => time(),
            'updated_at' => time()
        ]);
    }
} 